#pragma once

#include <QObject>
#include <QString>
#include <memory>
#include <thread>
#include <vector>
#include <queue>
#include <mutex>
#include <atomic>
#include <functional>

class QImage;
class WebSocketServer;
class WebSocketClient;

// 网络管理器：处理WebSocket服务器/客户端功能和视频流传输
class NetworkManager : public QObject
{
    Q_OBJECT

public:
    // 连接类型：服务器/客户端/未连接
    enum class ConnectionType
    {
        None,
        Server,
        Client
    };

    explicit NetworkManager(QObject *parent = nullptr);
    ~NetworkManager();

    Q_INVOKABLE bool startServer(quint16 port = 10000);              // 启动服务器
    Q_INVOKABLE bool startClient(const QString &host, quint16 port); // 启动客户端
    Q_INVOKABLE void stopConnection();                               // 停止连接
    Q_INVOKABLE void sendMessage(const QString &message);            // 发送文本消息

    // 视频传输方法
    Q_INVOKABLE void sendVideoFrame(const QImage &frame); // 发送视频帧
    Q_INVOKABLE void startVideoStream();                  // 开始视频流
    Q_INVOKABLE void stopVideoStream();                   // 停止视频流

    Q_INVOKABLE void setUsername(const QString &username) { m_username = username; } // 设置用户名
    Q_INVOKABLE QString username() const { return m_username; }                      // 获取用户名

    ConnectionType connectionType() const { return m_connectionType; } // 获取连接类型
    bool isConnected() const { return m_connected.load(); }            // 是否连接
    bool isVideoStreaming() const { return m_videoStreaming.load(); }  // 是否正在传输视频

    // 将内部方法改为public
    void setConnectionStatus(bool connected);                                // 设置连接状态
    void processMessage(const std::string &message, bool is_binary = false); // 处理消息
    void reportError(const QString &error);                                  // 报告错误

signals:
    void messageReceived(const QString &message); // 收到文本消息
    void connectionStatusChanged(bool connected); // 连接状态变化
    void errorOccurred(const QString &error);     // 发生错误
    void videoFrameReceived(const QImage &frame); // 收到视频帧

private slots:
    // WebSocketServer 的信号处理槽函数
    void onServerMessage(const QString &message);       // 处理服务器文本消息
    void onClientConnected();                           // 客户端连接
    void onClientDisconnected();                        // 客户端断开
    void onServerBinaryMessage(const QByteArray &data); // 处理服务器二进制消息

private:
    // WebSocket 服务器和客户端
    std::unique_ptr<WebSocketServer> m_server; // 服务器对象
    std::shared_ptr<WebSocketClient> m_client; // 客户端对象
    std::thread m_networkThread;               // 网络处理线程
    std::mutex m_videoMutex;                   // 视频帧队列互斥锁
    std::atomic<bool> m_videoStreaming{false}; // 视频流传输状态
    std::queue<QImage> m_videoFrameQueue;      // 视频帧队列

    ConnectionType m_connectionType = ConnectionType::None; // 连接类型
    std::atomic<bool> m_connected{false};                   // 连接状态
    std::atomic<bool> m_running{false};                     // 运行状态
    QString m_username;                                     // 当前用户名
};
